% Declaration des faits dynamiques
:- dynamic(plateau/1).
:- dynamic(joueur1/1). % [S(x,y)][r(x,y)][r(x,y)][r(x,y)][r(x,y)]
:- dynamic(joueur2/1).

:- include(coupspossible).
:- include(ia).
:- include(outils).

% Predicats

% concat(List1, List2, Concat_List1_List2):
%   Concat_List1_List2 is the concatenation of List1 & List2
concat([], List2, List2).
concat(List1, [], List1).
concat([Item | Tail1], List2, [Item | Concat_Tail1_List2]) :-
      concat(Tail1, List2, Concat_Tail1_List2).

%- enlever_doublons(l, m) enleve tous les elements redondants de l et met le resultat dans m -%
enlever_doublons([], []).
enlever_doublons([X|L], [X|M]):-
	hors_de(X, L),
	enlever_doublons(L, M).
enlever_doublons([_|L], M):-
	enlever_doublons(L, M).

hors_de(_, []).
hors_de(X, [Y|L]):-
	X \== Y,
	hors_de(X, L).

orientationplateau(1, 	[
				[2, 2, 3, 1, 2, 2],
				[1, 3, 1, 3, 1, 3],
				[3, 1, 2, 2, 3, 1],
				[2, 3, 1, 3, 1, 2],
				[2, 1, 3, 1, 3, 2],
				[1, 3, 2, 2, 1, 3]
			]
).

orientationplateau(2, 	[
				[1, 2, 2, 3, 1, 2],
				[3, 1, 3, 1, 3, 2],
				[2, 3, 1, 2, 1, 3],
				[2, 1, 3, 2, 3, 1],
				[1, 3, 1, 3, 1, 2],
				[3, 1, 2, 1, 3, 1]
			]
).

orientationplateau(3, 	[
				[3, 1, 2, 2, 3, 1],
				[2, 3, 1, 3, 1, 2],
				[2, 1, 3, 1, 3, 2],
				[1, 3, 2, 2, 1, 3],
				[3, 1, 3, 1, 3, 2],
				[2, 2, 1, 3, 2, 2]
			]
).

orientationplateau(4, 	[
				[2, 3, 1, 2, 2, 3],
				[2, 1, 3, 1, 3, 1],
				[1, 3, 2, 3, 1, 2],
				[3, 1, 2, 1, 3, 2],
				[2, 3, 1, 3, 1, 3],
				[2, 2, 3, 2, 2, 1]
			]
).

choixorientation(Numorientation) :- orientationplateau(Numorientation,P), asserta(plateau(P)).


%checkpion([],_,_,Z) :- Z=0.
%checkpion([T|Q],X,Y,Z) :- checkcoor(T, X, Y) . %veridier si on est sur la premiere case ou les autres

%checkcoor([T], X, Y) :- T=Y
%checkcoor([T|Q], X,Y) :- T=X

%checkpion(J, X, Y, V):-


%afficheplateau(P) : input plateau

affiche :- plateau(P), afficheplateau(P,0).

afficheplateau([],_).
afficheplateau([T|Q],N) :- write('|---------------|'), nl, afficheLigne(T,N), N2 is N-1 ,afficheplateau(Q,N2),!.


%affiche les valeurs de ligne puis demande l'affichage des joueurs par case
afficheLigne([],N) :- write('|'), nl, afficheligne2(N,0).
afficheLigne([T|Q],_) :- write('|'), write(T), write(' '), nl,  afficheLigne(Q),!.

%affichage des joueurs par case
%afficheligne2(N,Y) :- .

%joueur(X,Y,J1,Z) retourne le joueur et le pion de la case X Y
%%joueur(X,Y,J,Z):- 

%%joueur([[X|Y]|Q],X,Y) :- 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%retourne la valeur de la case dans le plateau

valeurplateau(X,Y,R) :-
	plateau(P),
	valeur(P,X,Y,R).

%retourne la valeur de la case
valeur([[U|V]|_], 1, Y, Z) :-		%on atteint la ligne voulue
	Y \== 1 , 
	valeur([U|V], 1, Y, Z),!.
valeur([T|_], 1 , 1 , Z) :- Z=T,!.	%on atteint la case voulue
valeur([_|Q], 1, Y, Z) :- 		%on est sur la bonne ligne mais pas sur la bonne case -> on avance
	Y2 is Y-1,
	valeur(Q, 1, Y2, Z),!.
valeur([_|Q], X, Y, Z) :-		%on est pas sur la bonne ligne, on passe à celle d'après
	X2 is X-1,
	valeur(Q, X2, Y, Z).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% selection des cases dans un tableau par leur valeur

case_par_valeur_plateau(V,R) :-
	plateau(P),
	case_par_valeur(P,V,R).

case_par_valeur(P,V,R):- case_par_valeur_2(P,[1,1],V,R).

case_par_valeur_2([],_,_,R):-R = "". 		%on est au bout du tableau

case_par_valeur_2([[]|Q], [_,Y], V,R) :- 	%on se trouve en fin de ligne
	Yt is Y+1,
	case_par_valeur_2(Q, [1, Yt], V, R),!.
	
case_par_valeur_2([[T1|Q1]|Q2], [X,Y], T1, [T3|Q3]) :- 	%on est sur une case de la bonne valeur
	T3 = [X,Y],
	Xt is X +1,
	case_par_valeur_2([Q1|Q2], [Xt,Y], T1, Q3),!.
	
case_par_valeur_2([[_|Q1]|Q2], [X,Y], V, R) :- 		%on est sur une case de la mauvaise valeur
	Xt is X +1,
	case_par_valeur_2([Q1|Q2], [Xt,Y], V, R).



%TODO : fonction de test à supprimer

valeur_test(X,Y,R) :-
	plateau(P),
	valeur(P,X,Y,R).



	
	


	






